home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / a_utils / perl / perl5a1.lha / perl5alpha1 / do / kv < prev    next >
Encoding:
Text File  |  1992-08-15  |  1.1 KB  |  57 lines

  1. int
  2. do_kv(TARG,hash,kv,gimme,arglast)
  3. STR *TARG;
  4. HASH *hash;
  5. int kv;
  6. int gimme;
  7. int *arglast;
  8. {
  9.     register ARRAY *ary = stack;
  10.     STR **st = ary->ary_array;
  11.     register int sp = arglast[0];
  12.     int i;
  13.     register HENT *entry;
  14.     char *tmps;
  15.     STR *tmpstr;
  16.     int dokeys = (kv == O_KEYS || kv == O_HASH);
  17.     int dovalues = (kv == O_VALUES || kv == O_HASH);
  18.  
  19.     if (gimme != G_ARRAY) {
  20.     i = 0;
  21.     (void)hiterinit(hash);
  22.     /*SUPPRESS 560*/
  23.     while (entry = hiternext(hash)) {
  24.         i++;
  25.     }
  26.     str_numset(TARG,(double)i);
  27.     STABSET(TARG);
  28.     st[++sp] = TARG;
  29.     return sp;
  30.     }
  31.     (void)hiterinit(hash);
  32.     /*SUPPRESS 560*/
  33.     while (entry = hiternext(hash)) {
  34.     if (dokeys) {
  35.         tmps = hiterkey(entry,&i);
  36.         if (!i)
  37.         tmps = "";
  38.         (void)astore(ary,++sp,str_2mortal(str_make(tmps,i)));
  39.     }
  40.     if (dovalues) {
  41.         tmpstr = Str_new(45,0);
  42. #ifdef DEBUGGING
  43.         if (debug & 8192) {
  44.         sprintf(buf,"%d%%%d=%d\n",entry->hent_hash,
  45.             hash->tbl_max+1,entry->hent_hash & hash->tbl_max);
  46.         str_set(tmpstr,buf);
  47.         }
  48.         else
  49. #endif
  50.         str_sset(tmpstr,hiterval(hash,entry));
  51.         (void)astore(ary,++sp,str_2mortal(tmpstr));
  52.     }
  53.     }
  54.     return sp;
  55. }
  56.  
  57.